package encheres.presentation.ui;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.text.SimpleDateFormat;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import encheres.manager.corba.C_Produit;

public class UIDetailsProduit extends JFrame {
	
	private JLabel jLabelPseudoVendeur = null;
	private JLabel jLabelDescriptionProduit = null;
	private JLabel jLabelCategorieProduit = null;
	private JLabel jLabelPrixDepartProduit = null;
	private JLabel jLabelPrixAcceptationProduit = null;
	private JLabel jLabelPrixActuelProduit = null;
	private JButton jButtonEncherir = null;
	private JPanel jPanelDetailsProduit = null;
	private JLabel jLabelLibelleProduit = null;
	private JLabel jLabelProduit = null;
	private JLabel jLabelLibelleCategorie = null;
	private JLabel jLabelLibelleVendeur = null;
	private JLabel jLabelLibelleDescription = null;
	private JLabel jLabelLibellePrixDepart = null;
	private JLabel jLabelLibellePrixAcceptation = null;
	private JLabel jLabelLibelleEcheance = null;
	private JLabel jLabelLibellePrixActuel = null;
	private JLabel jLabelLibelleProposerPrix = null;
	private JLabel jLabelEcheanceProduit = null;
	private JTextField jTextFieldNouveauPrix = null;
	private JScrollPane jScrollPaneEncheres = null;
	private JTable jTableEncheres = null;
	
	private C_Produit produitEnSelection = null;
	private int sessionCourante = -1;
	private Map<Integer, JFrame> refEnsembleFenetres = null;
	
	
	/**
	 * This method initializes 
	 * 
	 */
	public UIDetailsProduit(C_Produit produit, Map<Integer, JFrame> ensembleFenetres, int idSession) {
		super();
		produitEnSelection = produit;
		refEnsembleFenetres = ensembleFenetres;
		sessionCourante = idSession;
		initialize();
	}
	
	/**
	 * This method initializes this
	 * 
	 */
	private void initialize() {
        
        this.setTitle("Détails du produit: " + produitEnSelection.nom);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.addWindowListener(new WindowListener() {			
			public void windowClosed(WindowEvent e) {
				refEnsembleFenetres.remove(produitEnSelection.id);
			}
			public void windowOpened(WindowEvent e) {}
			public void windowClosing(WindowEvent e) {}
			public void windowIconified(WindowEvent e) {}
			public void windowDeiconified(WindowEvent e) {}
			public void windowActivated(WindowEvent e) {}
			public void windowDeactivated(WindowEvent e) {}
		});
        setLayout(null);
        this.pack();
        
        this.add(getJPanelDetailsProduit(), null);
        this.add(getJScrollPaneEncheres(), null);
        
        this.setSize(new Dimension(831, 730));
        this.setVisible(true);		
	}
	
	/**
	 * This method initializes jPanelDetailsProduit	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelDetailsProduit() {
		if (jPanelDetailsProduit == null) {
			
			float valeurDerniereEnchere = -1;
			for (int i=0; i<produitEnSelection.encheres.length; i++) {
				if (produitEnSelection.encheres[i].prix > valeurDerniereEnchere) {
					valeurDerniereEnchere = produitEnSelection.encheres[i].prix;
				}
			}
			
			jLabelPrixActuelProduit = new JLabel();
			jLabelPrixActuelProduit.setBounds(new Rectangle(210, 201, 94, 16));
			jLabelPrixActuelProduit.setText(Float.toString(valeurDerniereEnchere));
			jLabelPrixAcceptationProduit = new JLabel();
			jLabelPrixAcceptationProduit.setBounds(new Rectangle(210, 178, 94, 16));
			jLabelPrixAcceptationProduit.setText(Float.toString(produitEnSelection.prixAcceptation));
			jLabelPrixDepartProduit = new JLabel();
			jLabelPrixDepartProduit.setBounds(new Rectangle(210, 154, 94, 16));
			jLabelPrixDepartProduit.setText(Float.toString(produitEnSelection.prixDepart));
			jLabelCategorieProduit = new JLabel();
			jLabelCategorieProduit.setBounds(new Rectangle(107, 98, 190, 16));
			jLabelCategorieProduit.setText(produitEnSelection.nomCategorie);
			jLabelDescriptionProduit = new JLabel();
			jLabelDescriptionProduit.setBounds(new Rectangle(107, 75, 505, 16));
			jLabelDescriptionProduit.setText(produitEnSelection.description);
			jLabelPseudoVendeur = new JLabel();
			jLabelPseudoVendeur.setBounds(new Rectangle(107, 52, 236, 16));
			jLabelPseudoVendeur.setText(produitEnSelection.loginVendeur);
			jLabelEcheanceProduit = new JLabel();
			jLabelEcheanceProduit.setBounds(new Rectangle(400, 154, 110, 16));
			jLabelEcheanceProduit.setText(produitEnSelection.dateEcheance);
			jLabelLibelleProposerPrix = new JLabel();
			jLabelLibelleProposerPrix.setBounds(new Rectangle(22, 247, 115, 16));
			jLabelLibelleProposerPrix.setText("Monter l'enchère :");
			jLabelLibellePrixActuel = new JLabel();
			jLabelLibellePrixActuel.setBounds(new Rectangle(22, 201, 118, 16));
			jLabelLibellePrixActuel.setText("Dernière enchère : ");
			jLabelLibelleEcheance = new JLabel();
			jLabelLibelleEcheance.setBounds(new Rectangle(317, 154, 77, 16));
			jLabelLibelleEcheance.setText("Echéance :");
			jLabelLibellePrixAcceptation = new JLabel();
			jLabelLibellePrixAcceptation.setBounds(new Rectangle(22, 178, 178, 16));
			jLabelLibellePrixAcceptation.setText("Prix d'acceptation immédiate : ");
			jLabelLibellePrixDepart = new JLabel();
			jLabelLibellePrixDepart.setBounds(new Rectangle(22, 154, 99, 16));
			jLabelLibellePrixDepart.setText("Prix de départ :");
			jLabelLibelleDescription = new JLabel();
			jLabelLibelleDescription.setBounds(new Rectangle(22, 75, 88, 16));
			jLabelLibelleDescription.setText("Description :");
			jLabelLibelleVendeur = new JLabel();
			jLabelLibelleVendeur.setBounds(new Rectangle(22, 52, 63, 16));
			jLabelLibelleVendeur.setText("Vendeur : ");
			jLabelLibelleCategorie = new JLabel();
			jLabelLibelleCategorie.setBounds(new Rectangle(22, 98, 74, 16));
			jLabelLibelleCategorie.setText("Catégorie : ");
			jLabelProduit = new JLabel();
			jLabelProduit.setBounds(new Rectangle(22, 28, 63, 16));
			jLabelProduit.setText("Produit :");
			jLabelLibelleProduit = new JLabel();
			jLabelLibelleProduit.setBounds(new Rectangle(107, 28, 345, 16));
			jLabelLibelleProduit.setText(produitEnSelection.nom);
			jPanelDetailsProduit = new JPanel();
			jPanelDetailsProduit.setLayout(null);
			jPanelDetailsProduit.setBounds(new Rectangle(35, 392, 633, 274));
			jPanelDetailsProduit.setBorder(BorderFactory.createTitledBorder("Détail"));
			jPanelDetailsProduit.add(jLabelLibelleProduit, null);
			jPanelDetailsProduit.add(jLabelProduit, null);
			jPanelDetailsProduit.add(jLabelLibelleCategorie, null);
			jPanelDetailsProduit.add(jLabelLibelleVendeur, null);
			jPanelDetailsProduit.add(jLabelLibelleDescription, null);
			jPanelDetailsProduit.add(jLabelLibellePrixDepart, null);
			jPanelDetailsProduit.add(jLabelLibellePrixAcceptation, null);
			jPanelDetailsProduit.add(jLabelLibelleEcheance, null);
			jPanelDetailsProduit.add(jLabelLibellePrixActuel, null);
			jPanelDetailsProduit.add(jLabelLibelleProposerPrix, null);
			jPanelDetailsProduit.add(getJTextFieldNouveauPrix(), null);
			jPanelDetailsProduit.add(getJButtonEncherir(), null);
			jPanelDetailsProduit.add(jLabelPseudoVendeur, null);
			jPanelDetailsProduit.add(jLabelDescriptionProduit, null);
			jPanelDetailsProduit.add(jLabelCategorieProduit, null);
			jPanelDetailsProduit.add(jLabelPrixDepartProduit, null);
			jPanelDetailsProduit.add(jLabelPrixAcceptationProduit, null);
			jPanelDetailsProduit.add(jLabelPrixActuelProduit, null);
			jPanelDetailsProduit.add(jLabelEcheanceProduit, null);
		}
		return jPanelDetailsProduit;
	}
	
	

	/**
	 * This method initializes jButtonEncherir	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonEncherir() {
		if (jButtonEncherir == null) {
			jButtonEncherir = new JButton();
			jButtonEncherir.setText("Enchérir");
			jButtonEncherir.setBounds(new Rectangle(530, 246, 82, 20));
			jButtonEncherir.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					try {
						float montant = Float.valueOf(getJTextFieldNouveauPrix().getText());
						int res = CorbaManager.getManagerProduit().encherir(produitEnSelection.id, montant, sessionCourante);
						switch (res) {
						case 1:
							JOptionPane.showMessageDialog(jButtonEncherir.getRootPane(), "Votre enchère a bien été enregistrée", "Enchère effectuée", JOptionPane.ERROR_MESSAGE);
							break;
						case 0:
							JOptionPane.showMessageDialog(jButtonEncherir.getRootPane(), "Une enchère d'un montant supérieur a déjà été placée", "Enchère invalide", JOptionPane.ERROR_MESSAGE);
							break;
						case -1:
							JOptionPane.showMessageDialog(jButtonEncherir.getRootPane(), "Erreur de session utilisateur ou de base de données", "Erreur inconnue", JOptionPane.ERROR_MESSAGE);
							break;
						case -2:
							JOptionPane.showMessageDialog(jButtonEncherir.getRootPane(), "La valeur saisie doit se situer entre le prix de départ et le prix d'acceptation", "Valeur saisie incorrecte", JOptionPane.ERROR_MESSAGE);
							break;
						}
					} catch (NumberFormatException exception) {
						JOptionPane.showMessageDialog(jButtonEncherir.getRootPane(), exception.getMessage(), "Valeur incorrecte", JOptionPane.ERROR_MESSAGE);
					}
				}
			});
		}
		return jButtonEncherir;
	}
	
	
	/**
	 * This method initializes jTextFieldNouveauPrix	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getJTextFieldNouveauPrix() {
		if (jTextFieldNouveauPrix == null) {
			jTextFieldNouveauPrix = new JTextField();
			jTextFieldNouveauPrix.setBounds(new Rectangle(210, 246, 94, 20));
		}
		return jTextFieldNouveauPrix;
	}

	public void setProduit(C_Produit produit) {
		produitEnSelection = produit;
		initialize();
	}
	
	/**
	 * This method initializes jScrollPaneEncheres	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPaneEncheres() {
		if (jScrollPaneEncheres == null) {
			jScrollPaneEncheres = new JScrollPane();
			jScrollPaneEncheres.setBounds(new Rectangle(35, 215, 638, 160));
			jScrollPaneEncheres.setViewportView(getJTableEncheres());
		}
		return jScrollPaneEncheres;
	}
	
	/**
	 * This method initializes jTableProduits	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTableEncheres() {
		if (jTableEncheres == null) {
			// initialise les données
			String[][] donnees;
			try {
				donnees = this.getListEncheres();
			} catch (Exception e) {
				e.printStackTrace();
				donnees = new String[0][4];
				JOptionPane.showMessageDialog(jScrollPaneEncheres.getRootPane(), "Erreur inconnue lors du chargement des enchères.", "Enchères - Erreur", JOptionPane.ERROR_MESSAGE);
			} 
			String[] headers = {"Date", "Montant", "Utilisateur"};
			DefaultTableModel data = new DefaultTableModel(donnees, headers);
			jTableEncheres = new JTable(data);
			jTableEncheres.getColumnModel().getColumn(0).setMaxWidth(60);
			jTableEncheres.getColumnModel().getColumn(1).setMinWidth(40);
			jTableEncheres.getColumnModel().getColumn(2).setMaxWidth(60);
		}
		return jTableEncheres;
	}
	
	private String[][] getListEncheres() {
		String[][] tabEncheres = null;
		try {
			int tailleEncheres = produitEnSelection.encheres.length;
			tabEncheres = new String[tailleEncheres][3];
			for (int i = 0; i<tailleEncheres; i++) {
				tabEncheres[i][0] = produitEnSelection.encheres[i].date;
				tabEncheres[i][1] = String.valueOf(produitEnSelection.encheres[i].prix);
				tabEncheres[i][2] = String.valueOf(produitEnSelection.encheres[i].loginClient);
			}
			return tabEncheres;
		} catch (Exception e) {
			JOptionPane.showMessageDialog(jScrollPaneEncheres.getRootPane(), e.getMessage(), "Impossible de lister les enchères", JOptionPane.ERROR_MESSAGE);
			return null;
		}
	}

}
